all repos — caroster @ 52ad6be503528baa3feff0e610b44f0f82ffc2a3

[Octree] Group carpool to your event https://caroster.io

frontend/pages/e/[uuid]/waitingList.tsx (view raw)

 1import {useState, useMemo, PropsWithChildren, useReducer} from 'react';
 2import useProfile from '../../../hooks/useProfile';
 3import WaitingList from '../../../containers/WaitingList';
 4import pageUtils from '../../../lib/pageUtils';
 5import EventLayout, {TabComponent} from '../../../layouts/Event';
 6import {AddPassengerToWaitingList} from '../../../containers/NewPassengerDialog';
 7import {EventByUuidDocument} from '../../../generated/graphql';
 8
 9interface Props {
10  eventUUID: string;
11  announcement?: string;
12}
13
14const Page = (props: PropsWithChildren<Props>) => {
15  return <EventLayout {...props} Tab={WaitingListTab} />;
16};
17
18const WaitingListTab: TabComponent<Props> = ({event}) => {
19  const {userId} = useProfile();
20  const [dialogOpen, toggleDialog] = useReducer(i => !i, false);
21  const [isSelfAdd, setIsSelfAdd] = useState(false);
22
23  const registered = useMemo(() => {
24    if (!userId) return false;
25    const isInWaitingList = event?.waitingPassengers?.data?.some(
26      passenger => passenger.attributes.user?.data?.id === `${userId}`
27    );
28    return isInWaitingList;
29  }, [event, userId]);
30
31  return (
32    <>
33      <WaitingList
34        registered={registered}
35        canAddSelf={!!userId}
36        onAddSelf={() => {
37          setIsSelfAdd(true);
38          toggleDialog();
39        }}
40        onAddOther={() => {
41          setIsSelfAdd(false);
42          toggleDialog();
43        }}
44      />
45      <AddPassengerToWaitingList
46        open={dialogOpen}
47        toggle={toggleDialog}
48        addSelf={isSelfAdd}
49      />
50    </>
51  );
52};
53
54export const getServerSideProps = pageUtils.getServerSideProps(
55  async (context, apolloClient) => {
56    const {uuid} = context.query;
57    const {host = ''} = context.req.headers;
58    let event = null;
59
60    // Fetch event
61    try {
62      const {data} = await apolloClient.query({
63        query: EventByUuidDocument,
64        variables: {uuid},
65      });
66      event = data?.eventByUUID?.data;
67    } catch (error) {
68      return {
69        notFound: true,
70      };
71    }
72
73    const isCarosterPlus =
74      event?.attributes?.enabled_modules?.includes('caroster-plus');
75    if (isCarosterPlus)
76      return {
77        notFound: true,
78      };
79
80    return {
81      props: {
82        eventUUID: uuid,
83        metas: {
84          title: event?.attributes?.name || '',
85          url: `https://${host}${context.resolvedUrl}`,
86        },
87      },
88    };
89  }
90);
91
92export default Page;